// 整体思路是创建mystring类，已知c语言中的char
#ifndef __MYSTRING__
#define __MYSTRING__

#include <cstring>
#include <iostream>

class mystring;

class mystring{
public:
    // 防止用户只创建对象不初始化
    mystring(const char* data = 0);
    mystring(const mystring& data);
    
    mystring& operator = (const mystring& y);

    ~mystring();

    char* getStr() const { return m_data; }
private:
    char* m_data;    // 指针存储数据
};

// 在构造函数调用之前，数据一定为空，因此不需要判断
// C++规定一个给定的参数的默认值只能在程序中指定一次
// inline mystring::mystring(const char* cstr = 0) {
inline mystring::mystring(const char* cstr) {
    // if(m_data == data)
    if(cstr != nullptr) {
        // 加1的原因：留一个位置给结束符号
        m_data = new char[strlen(cstr) + 1];
        strcpy(m_data, cstr);
    } else {
        m_data = new char[1];
        // m_data是指针，\0 表示字符串结尾
        *m_data = '\0';
    }
}

inline mystring::mystring(const mystring& y) {
    m_data = new char[strlen(y.m_data) + 1];
    strcpy(m_data, y.m_data);
}

// 这里要返回值
inline mystring& mystring::operator = (const mystring& y) {
    if(this == &y) {
        // 返回this指针
        return *this;
    } else {
        delete[] m_data;
        m_data = new char[strlen(y.m_data) + 1];
        strcpy(m_data, y.m_data);
        return *this;
    }
}

inline mystring::~mystring() {
    delete[] m_data;
}

std::ostream& operator << (std::ostream& os, const mystring& y) {
    // 妙
    os << y.getStr();
    return os;
}

#endif